package com.nacos.demo;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * @author 夜曲sin
 * @create 2021/6/23
 */
public class PasswordEncoderUtil {

    public static void main(String[] args) {
        // nacos默认使用BCrypt算法进行密码的加密

/*
        spring security中的BCryptPasswordEncoder方法采用SHA-256 +随机盐+密钥对密码进行加密。
    SHA系列是Hash算法，不是加密算法，使用加密算法意味着可以解密（这个与编码/解码一样），但是采用Hash处理，其过程是不可逆的。
    （1）加密(encode)：
        注册用户时，使用SHA-256+随机盐+密钥把用户输入的密码进行hash处理，得到密码的hash值，然后将其存入数据库中。
    （2）密码匹配(matches)：
        用户登录时，密码匹配阶段并没有进行密码解密（因为密码经过Hash处理，是不可逆的），而是使用相同的算法把用户输入的密码进行hash处理，
      得到密码的hash值，然后将其与从数据库中查询到的密码hash值进行比较。如果两者相同，说明用户输入的密码正确。

 */

        String pass = "123456";

        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        String encodePass = encoder.encode(pass);

        System.out.println(encodePass); // 每次执行结果不同！
        // 输出：$2a$10$QTcWZl5HmiQsy1S3H33W7e2I1g1Iic7lOWMiofOaYcbkbWH7YvQMC

        // 校验密码是否匹配
        // 虽然每次加密结果不相同，但只要密码正确，匹配结果都会成功
        boolean matches = encoder.matches(pass, encodePass);
        System.out.println(matches);
    }
}
